package com.qf.test.controller;

import com.qf.test.pojo.Result;
import org.apache.ibatis.builder.IncompleteElementException;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

//表示这个一个控制层的类
@Controller
public class LoginController {
    @RequestMapping("/doLogin")
    public String doLogin(String username, String password, boolean rememberMe) {
        //1 将页面输入的明文密码 进行md5加密
        password = new Md5Hash(password, username, 1024).toString();
        System.out.println("密码密文：" + password);
        //2.将页面输入的用户名密码 封装成Shiro需要的用户名密码对象
        UsernamePasswordToken tokeno = new UsernamePasswordToken(username, password);

        //3.判断是都需要记住我
        if (rememberMe) {
            tokeno.setRememberMe(true);
        }
        //4.判断Subject对象 这个是Shiro框架的，记住当前用户 登录对象
        Subject subject = SecurityUtils.getSubject();


        try {
            //5.调用当前登录对象的认证方法，将用户名，密码对象传入 让shiro进行认证
            //当调用了login这个方法的时候，那么shiro会自动执行自定义Realm类中的认证方法
            subject.login(tokeno);
            //6.如果有异常 捕获异常返回错误信息的提示
            subject.login(tokeno);
        } catch (UnknownAccountException e) {
            return "/login.jsp";

        } catch (IncompleteElementException e) {
            return "/login.jsp";

        } catch (AuthenticationException e) {
            return "/login.jsp";

        }

        //登录成功跳转到首页
        return "index.jsp";


    }

    /**
     *注销退出
     */
    @RequestMapping("logout")
    @ResponseBody
    public Result logout(){
        //1.获取subject对象 当前登录用户对象
        Subject subject = SecurityUtils.getSubject();
        //2.调用退出方法  清除shirode soeeion中保存的用户 信息
        subject.logout();

        //3.跳转到登录页面 让用户重新登录
        return Result.ok("退出成功！");
    }
}
